home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!zephyr.ens.tek.com!tekred!saab!billr
- From: billr@saab.CNA.TEK.COM (Bill Randle)
- Newsgroups: comp.sources.games
- Subject: v11i022: sunbots - robots/Daleks game for SunView, Part01/03
- Message-ID: <6126@tekred.CNA.TEK.COM>
- Date: 10 Aug 90 17:54:06 GMT
- Sender: news@tekred.CNA.TEK.COM
- Lines: 1801
- Approved: billr@saab.CNA.TEK.COM
-
- Submitted-by: Kevin Wright <kevin@altair.csustan.edu>
- Posting-number: Volume 11, Issue 22
- Archive-name: sunbots/Part01
-
- [I ran this on my 3/60 (OS 3.5) with no problems. -br]
-
- [[This is a version of robots for sunview. It has a lot of the
- flavor of Daleks for the Mac.]]
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 1 (of 3)."
- # Contents: README MANIFEST level.c pics pics/human_d8.pic proc.c
- # sunbots.c sunbots.h
- # Wrapped by billr@saab on Fri Aug 10 10:47:55 1990
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'README' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'README'\"
- else
- echo shar: Extracting \"'README'\" \(1401 characters\)
- sed "s/^X//" >'README' <<'END_OF_FILE'
- XSunbots:
- X
- XSunbots is a sunview version of Robots. It also has additions that
- Xmake it resemble Daleks for the Mac.
- X
- XThe program should compile up easily enough. Just type make and it
- Xshould do the rest. You can edit the Makefile to tell it a few things
- Xlike where to install the game, etc.
- X
- XI don't know of any bugs in the program, of course there always could
- Xbe some. There are a few things that could be done:
- X
- X 1) The filer option for saving and loading is not implemented.
- X It probably wouldn't be hard at all to add this.
- X 2) The gems that appear on later levels should probably be
- X renamed and redrawn to be Jelly Babies to fit the Dr. Who
- X look of things more.
- X 3) My method of attempting to assure mutually exclusive access
- X to the high score file during updates is a bit crude and could
- X be fixed.
- X
- XPeople around our site seem to be content with the game as it is. It is
- Xa mild diversion for when you are tired of doing work.
- X
- XAnyone can do anything they want with this code. If anyone makes improvements
- Xor modifications to the program, it would be nice if you could send me a
- Xcopy of your changes so that I can take a look.
- X
- XHave Fun!
- X
- X Kevin Wright
- X
- XE-mail : kevin@altair.csustan.edu or kevin@csustan.csustan.edu
- XUS-mail: California State University, Stanislaus
- X Computer Science Department
- X 801 West Monte Vista Avenue
- X Turlock, CA 95380
- XPhone : (209) 667-3273
- END_OF_FILE
- if test 1401 -ne `wc -c <'README'`; then
- echo shar: \"'README'\" unpacked with wrong size!
- fi
- # end of 'README'
- fi
- if test -f 'MANIFEST' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'MANIFEST'\"
- else
- echo shar: Extracting \"'MANIFEST'\" \(1212 characters\)
- sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
- X File Name Archive # Description
- X-----------------------------------------------------------
- X MANIFEST 1
- X Makefile 2
- X README 1
- X images.c 2
- X images.h 2
- X level.c 1
- X move.c 2
- X pics 1
- X pics/debug.pic 2
- X pics/filer.pic 2
- X pics/gem.pic 3
- X pics/human2.pic 2
- X pics/human_d1.pic 2
- X pics/human_d8.pic 1
- X pics/icon.pic 2
- X pics/live.pic 2
- X pics/quit.pic 2
- X pics/reset.pic 2
- X pics/robot.pic 3
- X pics/robot2.pic 2
- X pics/scores.pic 2
- X pics/sonic.pic 2
- X pics/stand.pic 2
- X pics/tardis.pic 2
- X pics/teleport1.pic 2
- X pics/teleport2.pic 2
- X pics/tomb.pic 2
- X pics/trash.pic 3
- X pics/zap1.pic 3
- X pics/zap2.pic 3
- X pics/zap3.pic 3
- X pics/zap4.pic 2
- X proc.c 1
- X sunbots.c 1
- X sunbots.h 1
- X sunbots.man 2
- END_OF_FILE
- if test 1212 -ne `wc -c <'MANIFEST'`; then
- echo shar: \"'MANIFEST'\" unpacked with wrong size!
- fi
- # end of 'MANIFEST'
- fi
- if test -f 'level.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'level.c'\"
- else
- echo shar: Extracting \"'level.c'\" \(9776 characters\)
- sed "s/^X//" >'level.c' <<'END_OF_FILE'
- X/*****************************************************************
- X *
- X * level.c - Level creation and manipulation routines
- X *
- X * Created -- 1/5/90 Kevin Wright
- X *
- X *****************************************************************/
- X
- X#include "sunbots.h" /* Robots header file */
- X
- X/*****************************************************************
- X * make_level() - Create a new level. Delete all
- X * existing robots and create a new
- X * set of them. Reset screwdriver
- X * and place all objects.
- X *****************************************************************/
- X
- Xmake_level()
- X{
- X ScreenItem temp; /* Temp pointer to robot list */
- X
- X /* Destroy old and create new robots */
- X destroy_robots();
- X create_robots();
- X
- X /* Create gems if level is right */
- X if(current_level >= 10)
- X create_gems();
- X
- X /* Reset screwdriver */
- X screwdriver_uses = 1;
- X
- X /* Reset last stand */
- X last_stand_set = FALSE;
- X
- X /* Display level message */
- X switch(current_level) {
- X case 1:
- X display_msg("Welcome to Sunbots!", 2);
- X break;
- X case 5:
- X display_msg("Double Speed Robots", 2);
- X break;
- X case 10:
- X display_msg("Grab Gems For Extra Points!", 2);
- X break;
- X default:
- X break;
- X }
- X
- X /* Place human */
- X human->oldrow = human->oldcol = -1;
- X find_empty(human, &(human->row), (&human->col));
- X place_item(human, -1, -1);
- X
- X /* Place robots and gems */
- X for(temp = robot_list; temp; temp = temp->next) {
- X temp->oldrow = temp->oldcol = -1;
- X find_empty(temp, &(temp->row), &(temp->col));
- X place_item(temp, 0, 0);
- X }
- X}
- X
- X
- X/*****************************************************************
- X * remove_robots() - Remove robots in the
- X * specified rectangle.
- X *****************************************************************/
- X
- Xremove_robots(x0, y0, x1, y1, mode, score)
- Xint x0, y0, x1, y1, mode, score;
- X{
- X ScreenItem temp; /* Temp pointer to robot list */
- X
- X temp = robot_list;
- X while(temp) {
- X if(temp->row >= y0 && temp->row <= y1 &&
- X temp->col >= x0 && temp->col <= x1)
- X if(mode == ALL_STATES ||
- X (mode == LIVE_STATE && !temp->dead) ||
- X (mode == DEAD_STATE && temp->dead)) {
- X if(score && !temp->dead)
- X if(temp->type == SPEEDER_ROBOT)
- X update_score(10);
- X else
- X update_score(5);
- X remove_item(temp);
- X }
- X
- X temp = temp->next;
- X }
- X}
- X
- X
- X/*****************************************************************
- X * destroy_robots() - Destroy all robots in the
- X * list.
- X *****************************************************************/
- X
- Xdestroy_robots()
- X{
- X ScreenItem temp; /* Temp pointer to robot list */
- X
- X /* Traverse list and destroy each item */
- X while(robot_list) {
- X temp = robot_list;
- X robot_list = robot_list->next;
- X destroy_item(temp);
- X }
- X
- X /* Clear the playfield */
- X pw_rop(playfield_pw, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
- X PIX_CLR, NULL, 0, 0);
- X}
- X
- X
- X/*****************************************************************
- X * remove_item() - Remove an item from the robot_list.
- X *****************************************************************/
- X
- Xremove_item(item)
- XScreenItem item;
- X{
- X ScreenItem temp; /* Temp pointer to robot list */
- X
- X /* If item is first, then redirect main pointer */
- X if(robot_list == item) {
- X robot_list = robot_list->next;
- X destroy_item(item);
- X }
- X
- X /* Traverse list and find item to remove */
- X temp = robot_list;
- X while(temp) {
- X if(temp->next == item) {
- X temp->next = temp->next->next;
- X destroy_item(item);
- X }
- X temp = temp->next;
- X }
- X}
- X
- X
- X/*****************************************************************
- X * destroy_item() - Destroy a panel and free
- X * an item structure.
- X *****************************************************************/
- X
- Xdestroy_item(item)
- XScreenItem item;
- X{
- X /* Free memory */
- X free(item);
- X}
- X
- X
- X/*****************************************************************
- X * create_robots() - Create a list of robots. The number
- X * is based on the current level.
- X *****************************************************************/
- X
- Xcreate_robots()
- X{
- X int i; /* Loop variable */
- X int robot_num; /* Number of robots on this level */
- X Image image_type; /* Type of robot image */
- X ScreenItem temp; /* Temp pointer to robots */
- X
- X robot_num = (current_level < 12 ? 10 * current_level : 120);
- X
- X /* Create item structures and panels for robots */
- X for(i = 0; i < robot_num; i++) {
- X temp = (ScreenItem) malloc(sizeof(struct screen_item));
- X
- X if(current_level>=SPEEDER_LEVEL && RND(100)<SPEEDER_CHANCE) {
- X temp->type = SPEEDER_ROBOT;
- X image_type = robot2_image;
- X } else {
- X temp->type = NORMAL_ROBOT;
- X image_type = robot_image;
- X }
- X
- X temp->image = image_type;
- X temp->dead = FALSE;
- X temp->next = robot_list;
- X robot_list = temp;
- X }
- X}
- X
- X
- X/*****************************************************************
- X * create_gems()
- X *****************************************************************/
- X
- Xcreate_gems()
- X{
- X int i; /* Loop variable */
- X int gem_num; /* Number of gems on this level */
- X ScreenItem temp; /* Temp pointer to gems */
- X
- X gem_num = (current_level < 15 ? 4 * (current_level - 9) : 20);
- X
- X /* Create item structures and panels for gems */
- X for(i = 0; i < gem_num; i++) {
- X temp = (ScreenItem) malloc(sizeof(struct screen_item));
- X temp->type = GEM;
- X temp->image = gem_image;
- X temp->dead = TRUE;
- X temp->next = robot_list;
- X robot_list = temp;
- X }
- X}
- X
- X
- X/*****************************************************************
- X * find_empty() - Find a random empty location on the
- X * screen.
- X *****************************************************************/
- X
- Xfind_empty(item, row, col)
- XScreenItem item;
- Xint *row, *col;
- X{
- X ScreenItem temp; /* Temp pointer to robot list */
- X int found = TRUE; /* Flag indicating collision found */
- X
- X /* Find that spot */
- X while(found) {
- X *row = (rand() >> 3) % 40;
- X *col = (rand() >> 3) % 40;
- X found = (
- Xoccupied(item, *row, *col) != NULL);
- X }
- X}
- X
- X
- X/*****************************************************************
- X * occupied() - Check for occupation of square.
- X *****************************************************************/
- X
- XScreenItem occupied(item, row, col)
- XScreenItem item;
- Xint row, col;
- X{
- X ScreenItem temp;
- X
- X if(item != human && human->row == row && human->col == col)
- X return(human);
- X
- X temp = robot_list;
- X while(temp) {
- X if(item != temp && temp->row == row && temp->col == col)
- X return(temp);
- X temp = temp->next;
- X }
- X
- X return(NULL);
- X}
- X
- X/*****************************************************************
- X * place_item() - Set the row/col values for an item
- X * and redisplay.
- X *****************************************************************/
- X
- Xplace_item(item, xoffset, yoffset)
- XScreenItem item;
- Xint xoffset, yoffset;
- X{
- X int row, col, oldrow, oldcol;
- X
- X /* Calculate pixel offsets */
- X oldrow = ROW_HEIGHT * (item->oldrow + yoffset);
- X oldcol = COL_WIDTH * (item->oldcol + xoffset);
- X row = ROW_HEIGHT * (item->row + yoffset);
- X col = COL_WIDTH * (item->col + xoffset);
- X
- X /* Clear old picture and place new picture */
- X pw_rop(playfield_pw, oldcol, oldrow, item->image->width,
- X item->image->height, PIX_CLR, NULL, 0, 0);
- X pw_rop(playfield_pw, col, row, item->image->width,
- X item->image->height, PIX_SRC, item->image->picture, 0, 0);
- X}
- X
- X
- X/*****************************************************************
- X * set_image() - Change the image of the specified
- X * item.
- X *****************************************************************/
- X
- Xset_image(item, newimage, xoffset, yoffset)
- XScreenItem item;
- XImage newimage;
- Xint xoffset, yoffset;
- X{
- X int row, col;
- X
- X /* Calculate pixel offsets */
- X row = ROW_HEIGHT * (item->row + yoffset);
- X col = COL_WIDTH * (item->col + xoffset);
- X
- X /* Clear old picture and place new picture */
- X pw_rop(playfield_pw, col, row, item->image->width,
- X item->image->height, PIX_CLR, NULL, 0, 0);
- X pw_rop(playfield_pw, col, row, item->image->width,
- X item->image->height, PIX_SRC, newimage->picture, 0, 0);
- X
- X item->image = newimage;
- X}
- X
- X
- X/*****************************************************************
- X * refresh_image() - Redraw the picture for an item.
- X *****************************************************************/
- X
- Xrefresh_image(item, xoffset, yoffset)
- XScreenItem item;
- Xint xoffset, yoffset;
- X{
- X int row, col;
- X
- X /* Calculate pixel offsets */
- X row = ROW_HEIGHT * (item->row + yoffset);
- X col = COL_WIDTH * (item->col + xoffset);
- X
- X pw_rop(playfield_pw, col, row, item->image->width,
- X item->image->height, PIX_SRC, item->image->picture, 0, 0);
- X}
- X
- X
- X/*****************************************************************
- X * update_score() - Update the score by the given
- X * amount and redisplay it.
- X *****************************************************************/
- X
- Xupdate_score(amount)
- Xint amount;
- X{
- X char temp_string[80]; /* Temporary storage string */
- X
- X /* Add amount and create new string */
- X current_score += amount;
- X sprintf(temp_string, "Level %6d Score %6d",
- X current_level, current_score);
- X
- X /* Display new string */
- X panel_set(score, PANEL_LABEL_STRING, temp_string, 0);
- X}
- X
- X
- X/*****************************************************************
- X * update_level() - Update the level by the given
- X * amount and redisplay it.
- X *****************************************************************/
- X
- Xupdate_level(amount)
- Xint amount;
- X{
- X char temp_string[80]; /* Temporary storage string */
- X
- X /* Add amount and create new string */
- X current_level += amount;
- X sprintf(temp_string, "Level %6d Score %6d",
- X current_level, current_score);
- X
- X /* Display new string */
- X panel_set(score, PANEL_LABEL_STRING, temp_string, 0);
- X}
- X
- X
- X/*****************************************************************
- X * do_death() - Display a tomb stone where the
- X * player used to be.
- X *****************************************************************/
- X
- Xdo_death()
- X{
- X /* Change human picture to tombstone */
- X set_image(human, tomb_image, -1, -1);
- X
- X make_hs();
- X if(!window_get(hs_popup_frame, WIN_SHOW))
- X do_pop_proc();
- X}
- X
- X
- END_OF_FILE
- if test 9776 -ne `wc -c <'level.c'`; then
- echo shar: \"'level.c'\" unpacked with wrong size!
- fi
- # end of 'level.c'
- fi
- if test ! -d 'pics' ; then
- echo shar: Creating directory \"'pics'\"
- mkdir 'pics'
- fi
- if test -f 'pics/human_d8.pic' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'pics/human_d8.pic'\"
- else
- echo shar: Extracting \"'pics/human_d8.pic'\" \(8429 characters\)
- sed "s/^X//" >'pics/human_d8.pic' <<'END_OF_FILE'
- X/* Format_version=1, Width=48, Height=48, Depth=8, Valid_bits_per_item=16
- X */
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0200,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0002,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0002,0x0202,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0202,0x0200,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0202,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0202,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0202,0x0202,0x0202,0x0202,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0000,
- X 0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0002,0x0200,0x0202,0x0202,0x0002,0x0200,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,
- X 0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0000,0x0000,
- X 0x0000,0x0002,0x0000,0x0202,0x0202,0x0000,0x0200,0x0000,
- X 0x0000,0x0000,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,
- X 0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,
- X 0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,
- X 0x0000,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0200,0x0002,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0200,0x0002,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0200,0x0002,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0202,0x0200,0x0002,0x0202,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0202,0x0200,0x0002,0x0202,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0202,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0202,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0002,0x0202,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0202,0x0200,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0200,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0002,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
- X 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
- END_OF_FILE
- if test 8429 -ne `wc -c <'pics/human_d8.pic'`; then
- echo shar: \"'pics/human_d8.pic'\" unpacked with wrong size!
- fi
- # end of 'pics/human_d8.pic'
- fi
- if test -f 'proc.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'proc.c'\"
- else
- echo shar: Extracting \"'proc.c'\" \(7724 characters\)
- sed "s/^X//" >'proc.c' <<'END_OF_FILE'
- X/*****************************************************************
- X *
- X * proc.c - Icon activated processes.
- X *
- X * Created -- 1/5/90 Kevin Wright
- X *
- X *****************************************************************/
- X
- X#include "sunbots.h" /* Robots header file */
- X
- X/*****************************************************************
- X * new_proc() - This procedure is called at the
- X * start and whenever reset is pressed.
- X * If the human object does not exist,
- X * then it is created. The score and
- X * level are reset. The first level
- X * is created.
- X *****************************************************************/
- X
- Xnew_proc()
- X{
- X /* Create the human */
- X if(!human) {
- X human = (ScreenItem) malloc(sizeof(struct screen_item));
- X human->image = human_image;
- X human->next = NULL;
- X }
- X
- X /* Reset human to alive and looking like a human */
- X human->type = HUMAN;
- X human->dead = FALSE;
- X human->image = human_image;
- X human->oldrow = human->oldcol = -1;
- X
- X /* Reset score, level, and lives. Make first level */
- X update_score(-current_score);
- X update_level(1 - current_level);
- X lives_remaining = 2;
- X make_level();
- X}
- X
- X
- X/*****************************************************************
- X * filer_proc() - Not Implemented Yet
- X *****************************************************************/
- X
- Xfiler_proc()
- X{
- X}
- X
- X
- X/*****************************************************************
- X * teleport_proc() - Teleport the human to a random
- X * place on the screen. An empty
- X * location is found and the human is
- X * moved there. Robots move after a
- X * teleportation occurs.
- X *****************************************************************/
- X
- Xteleport_proc()
- X{
- X int i, j; /* Loop variables */
- X
- X /* If the human is dead, forget it */
- X if(human->dead)
- X return;
- X
- X /* Make some fancy display */
- X for(i = 0; i < 10; i++) {
- X set_image(human, teleport_image[1], -1, -1);
- X for(j = 0; j < TARDIS_BLINK_RATE; j++)
- X ;
- X set_image(human, teleport_image[0], -1, -1);
- X for(j = 0; j < TARDIS_BLINK_RATE; j++)
- X ;
- X }
- X
- X /* Find an empty place and put the human there */
- X human->oldrow = human->row;
- X human->oldcol = human->col;
- X find_empty(human, &(human->row), (&human->col));
- X place_item(human, -1, -1);
- X
- X /* Make some more fancy display */
- X for(i = 0; i < 10; i++) {
- X set_image(human, teleport_image[1], -1, -1);
- X for(j = 0; j < TARDIS_BLINK_RATE; j++)
- X ;
- X set_image(human, teleport_image[0], -1, -1);
- X for(j = 0; j < TARDIS_BLINK_RATE; j++)
- X ;
- X }
- X
- X /* Put the human back to normal and move the robots */
- X set_image(human, human_image, -1, -1);
- X move_robots(ALL_ROBOTS);
- X}
- X
- X
- X/*****************************************************************
- X * sonic_proc() - Activate sonic screwdriver.
- X * Draw sonic blast and then remove
- X * all robots in blast range.
- X * Remove one use from screwdriver.
- X *****************************************************************/
- X
- Xsonic_proc()
- X{
- X int i, j, k; /* Loop variables */
- X
- X /* If human is dead or screwdriver is empty, then forget it */
- X if(!screwdriver_uses || human->dead)
- X return;
- X
- X /* Decrement uses and draw zap */
- X screwdriver_uses--;
- X set_image(human, zap_image[0], -1, -1);
- X for(i = 0; i < 10; i++) {
- X for(j = 1; j < 4; j++) {
- X set_image(human, zap_image[j], -1, -1);
- X for(k = 1; k < SONIC_CYCLE_RATE; k++)
- X ;
- X }
- X for(j = 2; j >= 0; j--) {
- X set_image(human, zap_image[j], -1, -1);
- X for(k = 1; k < SONIC_CYCLE_RATE; k++)
- X ;
- X }
- X }
- X set_image(human, human_image, -1, -1);
- X
- X /* Remove robots and let remaining robots move */
- X remove_robots(human->col-1, human->row-1,
- X human->col+1, human->row+1, LIVE_STATE, TRUE);
- X move_robots(ALL_ROBOTS);
- X}
- X
- X
- X/*****************************************************************
- X * stand_proc() - Let the player make a last stand.
- X * Move robots until human is dead or
- X * all robots are dead.
- X *****************************************************************/
- X
- Xstand_proc()
- X{
- X /* If human is dead, then forget it */
- X if(human->dead)
- X return;
- X
- X /* Set last stand flag */
- X last_stand_set = TRUE;
- X
- X /* Move the robots */
- X while(move_robots(ALL_ROBOTS))
- X ;
- X}
- X
- X
- X/*****************************************************************
- X * quit_proc() - Put up an alert for confirmation
- X * of quit. If OK, then destroy
- X * the frame, else return to game.
- X *****************************************************************/
- X
- Xquit_proc()
- X{
- X#ifdef SUNOS3_5
- X window_destroy(frame);
- X#else
- X int result; /* Result from alert */
- X Event event; /* Event from alert */
- X
- X /* Get result from an alert */
- X result = alert_prompt(frame, &event,
- X ALERT_MESSAGE_STRINGS, "Are you sure you want to Quit?", 0,
- X ALERT_BUTTON_YES, "Confirm",
- X ALERT_BUTTON_NO, "Cancel",
- X 0);
- X
- X /* Process result */
- X switch(result) {
- X case ALERT_YES:
- X window_destroy(frame);
- X break;
- X default:
- X break;
- X }
- X#endif
- X}
- X
- X
- X/*****************************************************************
- X * move_proc() - Get mouse coordinates from playfield
- X * and make player move toward the click.
- X *****************************************************************/
- X
- Xmove_proc(canvas, event)
- XCanvas canvas;
- XEvent *event;
- X{
- X int level; /* Level activated on */
- X int action; /* The event action */
- X int row, col; /* Row and column of mouse click */
- X
- X /* If not right or left mouse click or human is dead, forget it */
- X#ifdef SUNOS3_5
- X action = event_id(event);
- X#else
- X action = event_action(event);
- X#endif
- X if((action != MS_RIGHT && action != MS_LEFT &&
- X action != MS_MIDDLE && action != KEY_TOP(1) &&
- X action != KEY_TOP(2)) || human->dead)
- X return;
- X
- X /* Convert coordinates to row/col */
- X row = event_y(event) / ROW_HEIGHT;
- X col = event_x(event) / COL_WIDTH;
- X level = current_level;
- X
- X if(action == KEY_TOP(1)) {
- X dump_pic();
- X return;
- X }
- X if(action == KEY_TOP(2)) {
- X dump_hs();
- X return;
- X }
- X
- X if(action == MS_LEFT)
- X move_one(row, col);
- X else
- X while(TRUE) {
- X /* If human dead or robots dead, stop */
- X if(level != current_level || human->dead)
- X break;
- X
- X /* If we are doing safe move, then think */
- X if(action == MS_MIDDLE && unsafe(row, col))
- X teleport_proc();
- X
- X /* Move once */
- X move_one(row, col);
- X
- X /* If we arrive, then stop */
- X if(row == human->row && col == human->col)
- X break;
- X }
- X}
- X
- X
- X/*****************************************************************
- X * do_pop_proc() - Add or remove the popup high
- X * score window.
- X *****************************************************************/
- X
- Xdo_pop_proc()
- X{
- X /* If not shown, refresh and display, else remove it */
- X if(!window_get(hs_popup_frame, WIN_SHOW)) {
- X get_hs();
- X update_hs();
- X window_set(hs_popup_frame, WIN_SHOW, TRUE, 0);
- X } else
- X window_set(hs_popup_frame, WIN_SHOW, FALSE, 0);
- X}
- X
- X
- X/*
- X *
- X */
- X
- Xsetup_proc()
- X{
- X struct itimerval timer; /* Timer for removing message */
- X
- X timer.it_interval.tv_usec = 0;
- X timer.it_interval.tv_sec = 1;
- X timer.it_value.tv_usec = 0;
- X timer.it_value.tv_sec = 1;
- X
- X notify_set_itimer_func(msg_popup_frame, startup_proc,
- X ITIMER_REAL, &timer, NULL);
- X}
- X
- X
- X/*
- X *
- X */
- X
- Xstartup_proc()
- X{
- X new_proc();
- X}
- X
- X
- X/*****************************************************************
- X * debug_proc() - For debugging. Teleport one
- X * level.
- X *****************************************************************/
- X
- Xdebug_proc()
- X{
- X /* Go up one level */
- X update_level(1);
- X make_level();
- X}
- X
- X
- X/*****************************************************************
- X * live_proc() - For debugging. Bring human back
- X * to life.
- X *****************************************************************/
- X
- Xlive_proc()
- X{
- X ScreenItem temp;
- X
- X /* Bring human back to life */
- X human->dead = FALSE;
- X set_image(human, human_image, -1, -1);
- X
- X /* Refresh the robots */
- X temp = robot_list;
- X while(temp) {
- X refresh_image(temp, 0, 0);
- X temp = temp->next;
- X }
- X
- X}
- X
- X
- END_OF_FILE
- if test 7724 -ne `wc -c <'proc.c'`; then
- echo shar: \"'proc.c'\" unpacked with wrong size!
- fi
- # end of 'proc.c'
- fi
- if test -f 'sunbots.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'sunbots.c'\"
- else
- echo shar: Extracting \"'sunbots.c'\" \(16439 characters\)
- sed "s/^X//" >'sunbots.c' <<'END_OF_FILE'
- X/*****************************************************************
- X *
- X * sunbots.c - Robots for SunView
- X *
- X * Created -- 1/5/90 Kevin Wright
- X *
- X *****************************************************************/
- X
- X#include "sunbots.h" /* Robots header file */
- X
- X/*
- X * Global Variables
- X */
- X
- XFrame frame; /* Base frame for window */
- XFrame hs_popup_frame; /* High score popup sub-frame */
- XFrame msg_popup_frame; /* Message popup sub-frame */
- XCanvas playfield; /* Main battlefield for robots */
- XPixwin *playfield_pw; /* Pixwin for the battlefield */
- XPixwin *window_pw; /* Pixwin for the window */
- XPanel msg_window; /* Panel for displaying score */
- XPanel cmd_window; /* Panel that contains buttons */
- XPanel mov_window; /* Panel containing movement gadgets */
- XPanel hs_popup_panel; /* High score popup sub-window */
- XPanel msg_popup_panel; /* Message popup sub-window */
- XPanel_item score; /* Item to display score and level */
- XPanel_item msg_popup_label; /* Label for popup panel */
- XPanel_item hs[10] = {0,0,0,0,0,0,0,0,0,0}; /* Top ten score panels */
- XScreenItem human = NULL; /* Structure containing human */
- XScreenItem robot_list = NULL; /* Linked list of robots */
- X
- XHiScoreList hs_list; /* High score chart */
- X
- Xint current_level; /* Current level number */
- Xint current_score; /* Current score */
- Xint screwdriver_uses; /* How many sonic blasts */
- Xint last_stand_set; /* Are we doing a last stand */
- Xint lives_remaining; /* Number of lives remaining */
- X
- X
- X/*****************************************************************
- X * main() - The base frame is created with title
- X * "Robots". The images are initialized.
- X * The message, playfield, and command
- X * windows are set up and the game is started.
- X *****************************************************************/
- X
- Xvoid main(argc, argv)
- Xint argc;
- Xchar **argv;
- X{
- X /* Seed random numbers */
- X SEED(time(NULL));
- X
- X /* Build base frame */
- X frame = window_create(NULL, FRAME,
- X FRAME_ARGS, argc, argv,
- X FRAME_LABEL, "Sunbots v2.0",
- X#ifndef SUNOS3_5
- X FRAME_NO_CONFIRM, TRUE,
- X#endif
- X FRAME_ICON, icon_image,
- X 0);
- X
- X /* Init some panels */
- X init_msg_window();
- X init_playfield();
- X
- X /* Create the pixrect images */
- X make_pics();
- X
- X /* Init remaining panels */
- X init_cmd_window();
- X init_hs_popup();
- X init_msg_popup();
- X
- X /* Setup to start a new game */
- X setup_proc();
- X
- X /* Fit the frame and do window loop */
- X window_fit(frame);
- X window_main_loop(frame);
- X
- X exit(0);
- X}
- X
- X
- X/*****************************************************************
- X * init_msg_window() - The message window is
- X * created. It contains the
- X * level and score.
- X *****************************************************************/
- X
- Xinit_msg_window()
- X{
- X /* Create message window */
- X msg_window = window_create(frame, PANEL,
- X WIN_ROWS, 1,
- X 0);
- X
- X /* Create item to display level and score */
- X score = panel_create_item(msg_window, PANEL_MESSAGE,
- X PANEL_LABEL_STRING, "Level 0 Score 0",
- X 0);
- X}
- X
- X
- X/*****************************************************************
- X * init_playfield() - The playfield is created.
- X * There are no margins and
- X * no row/col gaps. The
- X * only events that are noticed
- X * by this window are those
- X * from the left mouse button.
- X *****************************************************************/
- X
- Xinit_playfield()
- X{
- X int i;
- X unsigned char red[4], green[4], blue[4];
- X
- X /* Create playfield window */
- X playfield = window_create(frame, CANVAS,
- X WIN_ROW_HEIGHT, ROW_HEIGHT,
- X WIN_COLUMN_WIDTH, COL_WIDTH,
- X WIN_ROW_GAP, 0,
- X WIN_COLUMN_GAP, 0,
- X WIN_LEFT_MARGIN, 0,
- X WIN_RIGHT_MARGIN, 0,
- X WIN_TOP_MARGIN, 0,
- X WIN_BOTTOM_MARGIN, 0,
- X WIN_ROWS, SCRN_ROWS,
- X WIN_COLUMNS, SCRN_COLS,
- X WIN_BELOW, msg_window,
- X WIN_CONSUME_KBD_EVENTS, WIN_NO_EVENTS,
- X KEY_TOP(1),
- X KEY_TOP(2),
- X 0,
- X WIN_CONSUME_PICK_EVENTS,WIN_NO_EVENTS,
- X MS_LEFT, MS_RIGHT, MS_MIDDLE,
- X 0,
- X WIN_EVENT_PROC, move_proc,
- X CANVAS_RETAINED, FALSE,
- X 0);
- X
- X /* Get pixwin of playfield and window */
- X window_pw = (Pixwin *) window_get(playfield, WIN_PIXWIN);
- X playfield_pw = canvas_pixwin(playfield);
- X
- X /* Set color values */
- X if(window_pw->pw_pixrect->pr_depth == 1)
- X for(i = 0; i < 4; i++) {
- X red[i] = (i == 0 ? 255 : 0);
- X green[i] = (i == 0 ? 255 : 0);
- X blue[i] = (i == 0 ? 255 : 0);
- X }
- X else
- X for(i = 0; i < 4; i++) {
- X red[i] = (i == 3 || i == 0 ? 255 : 0);
- X green[i] = (i == 2 || i == 0 ? 255 : 0);
- X blue[i] = (i == 1 || i == 0 ? 255 : 0);
- X }
- X
- X /* Set color map for WIN_PIXWIN */
- X pw_setcmsname(window_pw, "playfield_cm");
- X pw_putcolormap(window_pw, 0, 4, red, green, blue);
- X
- X /* Set color map for CANVAS_PIXWIN */
- X pw_setcmsname(playfield_pw, "playfield_cm");
- X pw_putcolormap(playfield_pw, 0, 4, red, green, blue);
- X
- X /* Set canvas to retain */
- X window_set(playfield, CANVAS_RETAINED, TRUE, 0);
- X}
- X
- X
- X/*****************************************************************
- X * init_cmd_window() - The command window is
- X * created and buttons are
- X * created for each command.
- X *****************************************************************/
- X
- Xinit_cmd_window()
- X{
- X /* Create command window */
- X cmd_window = window_create(frame, PANEL,
- X WIN_BELOW, msg_window,
- X WIN_RIGHT_OF, playfield,
- X WIN_WIDTH, 75,
- X WIN_LEFT_MARGIN, 5,
- X WIN_RIGHT_MARGIN, 5,
- X 0);
- X
- X /* Create high scores gadget */
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, scores_image->picture,
- X PANEL_NOTIFY_PROC, do_pop_proc,
- X 0);
- X
- X /* Create reset gadget */
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, reset_image->picture,
- X PANEL_NOTIFY_PROC, new_proc,
- X 0);
- X
- X /* Create quit gadget */
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, quit_image->picture,
- X PANEL_NOTIFY_PROC, quit_proc,
- X 0);
- X
- X /* Create last stand gadget */
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, stand_image->picture,
- X PANEL_NOTIFY_PROC, stand_proc,
- X 0);
- X
- X /* Create sonic screwdriver gadget */
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, sonic_image->picture,
- X PANEL_NOTIFY_PROC, sonic_proc,
- X 0);
- X
- X /* Create teleportation gadget */
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, tardis_image->picture,
- X PANEL_NOTIFY_PROC, teleport_proc,
- X 0);
- X
- X /* Create filer gadget */
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, filer_image->picture,
- X PANEL_NOTIFY_PROC, filer_proc,
- X 0);
- X
- X /* If UID = debugger, then put up debug icon */
- X if(getuid() == DEBUG_UID) {
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, debug_image->picture,
- X PANEL_NOTIFY_PROC, debug_proc,
- X 0);
- X
- X panel_create_item(cmd_window, PANEL_BUTTON,
- X PANEL_LABEL_IMAGE, live_image->picture,
- X PANEL_NOTIFY_PROC, live_proc,
- X 0);
- X }
- X}
- X
- X
- X/*****************************************************************
- X * init_hs_popup() - Create the high score popup
- X * window. Get the high scores and
- X * add them to the window. Create
- X * two DONE gadgets for removing the
- X * chart.
- X *****************************************************************/
- X
- Xinit_hs_popup()
- X{
- X /* Create the popup sub-frame and sub-window */
- X hs_popup_frame = window_create(frame, FRAME,
- X FRAME_LABEL, " TOP TEN ROBOT HUNTERS",
- X FRAME_SHOW_LABEL, TRUE,
- X WIN_SHOW, FALSE,
- X 0);
- X hs_popup_panel = window_create(hs_popup_frame,
- X PANEL,
- X 0);
- X
- X /* Get and update the high score list */
- X get_hs();
- X update_hs();
- X
- X /* Create two DONE buttons */
- X panel_create_item(hs_popup_panel, PANEL_BUTTON,
- X PANEL_ITEM_X, ATTR_COL(0),
- X PANEL_ITEM_Y, ATTR_ROW(HS_NUM_SCORES + 1),
- X PANEL_LABEL_IMAGE, panel_button_image(hs_popup_panel,
- X "DONE", 5,
- X 0),
- X PANEL_NOTIFY_PROC, do_pop_proc,
- X 0);
- X panel_create_item(hs_popup_panel, PANEL_BUTTON,
- X PANEL_ITEM_X, ATTR_COL(30),
- X PANEL_ITEM_Y, ATTR_ROW(HS_NUM_SCORES + 1),
- X PANEL_LABEL_IMAGE, panel_button_image(hs_popup_panel,
- X "DONE", 5,
- X 0),
- X PANEL_NOTIFY_PROC, do_pop_proc,
- X 0);
- X
- X /* Fit the panel and the frame */
- X window_fit(hs_popup_panel);
- X window_fit(hs_popup_frame);
- X}
- X
- X
- X/*****************************************************************
- X * init_msg_popup() - Create a sub-frame and
- X * sub-window to display a
- X * message in.
- X *****************************************************************/
- X
- Xinit_msg_popup()
- X{
- X /* Create sub-frame and sub-window */
- X msg_popup_frame = window_create(frame, FRAME,
- X WIN_SHOW, FALSE,
- X 0);
- X msg_popup_panel = window_create(msg_popup_frame, PANEL,
- X 0);
- X
- X /* Create message label */
- X msg_popup_label = panel_create_item(msg_popup_panel, PANEL_MESSAGE,
- X PANEL_LABEL_STRING, " ",
- X 0);
- X
- X /* Size to fit message */
- X window_fit(msg_popup_panel);
- X window_fit(msg_popup_frame);
- X}
- X
- X
- X/*****************************************************************
- X * display_msg() - Add a message to the popup window
- X * and display it.
- X *****************************************************************/
- X
- Xdisplay_msg(string, time)
- Xchar *string;
- Xint time;
- X{
- X int play_x, play_y; /* Start point of playfield */
- X int play_width, play_height; /* Width and height of playfield */
- X int msg_width, msg_height; /* Width and height of popup msg */
- X
- X struct itimerval timer; /* Timer for removing message */
- X
- X /* Change the message string */
- X panel_set(msg_popup_label, PANEL_LABEL_STRING, string, 0);
- X
- X /* Fit the windows again */
- X window_fit(msg_popup_panel);
- X window_fit(msg_popup_frame);
- X
- X /* Center frame in center of playfield */
- X play_x = (int) window_get(playfield, WIN_X);
- X play_y = (int) window_get(playfield, WIN_Y);
- X play_width = (int) window_get(playfield, WIN_WIDTH);
- X play_height = (int) window_get(playfield, WIN_HEIGHT);
- X
- X msg_width = (int) window_get(msg_popup_panel, WIN_WIDTH);
- X msg_height = (int) window_get(msg_popup_panel, WIN_HEIGHT);
- X
- X window_set(msg_popup_frame,
- X WIN_X, play_x + ((play_width - msg_width) >> 1),
- X WIN_Y, play_y + ((play_height - msg_height) >> 1),
- X 0);
- X
- X /* Set up time interval */
- X timer.it_interval.tv_usec = 0;
- X timer.it_interval.tv_sec = time;
- X timer.it_value.tv_usec = 0;
- X timer.it_value.tv_sec = time;
- X
- X /* Show the panel, wait some time, and remove the panel */
- X window_set(msg_popup_frame, WIN_SHOW, TRUE, 0);
- X notify_set_itimer_func(msg_popup_frame, kill_display,
- X ITIMER_REAL, &timer, NULL);
- X}
- X
- X
- X/*****************************************************************
- X * kill_display() - Remove the message from the screen.
- X *****************************************************************/
- X
- Xkill_display()
- X{
- X window_set(msg_popup_frame, WIN_SHOW, FALSE, 0);
- X notify_set_itimer_func(msg_popup_frame, kill_display,
- X ITIMER_REAL, NULL, NULL);
- X}
- X
- X
- X/*****************************************************************
- X * update_hs() - Update the high score display.
- X * If called for the first time, then
- X * create the message panels as well.
- X *****************************************************************/
- X
- Xupdate_hs()
- X{
- X int i; /* Loop variable */
- X char tempstr[80]; /* Temporary storage string */
- X
- X /* If first time, then build the panels. Setup the list */
- X for(i = 0; i < HS_NUM_SCORES; i++) {
- X if(!hs[i]) {
- X hs[i] = panel_create_item(hs_popup_panel,PANEL_MESSAGE,
- X PANEL_ITEM_X, ATTR_COL(0),
- X PANEL_ITEM_Y, ATTR_ROW(i),
- X 0);
- X }
- X
- X sprintf(tempstr, "%2d) %-10s level %2d %6d pts",
- X i + 1, hs_list.names[i], hs_list.levels[i],
- X hs_list.scores[i]);
- X panel_set(hs[i], PANEL_LABEL_STRING, tempstr, 0);
- X }
- X}
- X
- X
- X/*****************************************************************
- X * get_hs() - Get the high scores from the high
- X * score file. If open fails, then
- X * an error is reported and FALSE is
- X * returned. TRUE is returned
- X * otherwise.
- X *****************************************************************/
- X
- Xget_hs()
- X{
- X int i; /* Loop variable */
- X FILE *hs_file; /* Pointer to the high score file */
- X
- X /* Open high score file and report any errors */
- X if(!(hs_file = fopen(HSFILE, "r"))) {
- X fprintf(stderr, "get_ps: Can't open high score file %s\n",
- X HSFILE);
- X return(FALSE);
- X }
- X
- X /* Read the high score list and close the file */
- X fread((char *) &hs_list, sizeof(hs_list), 1, hs_file);
- X fclose(hs_file);
- X
- X return(TRUE);
- X}
- X
- X
- X/*****************************************************************
- X * put_hs - Write the new high score list to
- X * the high score file. Report any
- X * errors in opening the file.
- X *****************************************************************/
- X
- Xput_hs()
- X{
- X FILE *hs_file; /* Pointer to the high score file */
- X
- X /* Open the high score file and report any errors */
- X if(!(hs_file = fopen(HSFILE, "w"))) {
- X fprintf(stderr, "put_hs: Can't open high score file %s\n",
- X HSFILE);
- X return;
- X }
- X
- X /* Write the high score list and close the file */
- X fwrite((char *) &hs_list, sizeof(hs_list), 1, hs_file);
- X fclose(hs_file);
- X}
- X
- X
- X/*****************************************************************
- X * make_hs() - Add a new high score to the high
- X * score chart. First lock the chart
- X * against access. Get the current
- X * score list and add the new score to
- X * the list. Write the new list out
- X * and unlock the file.
- X *****************************************************************/
- X
- Xmake_hs()
- X{
- X int obtained; /* Flag indicating successful hs lookup */
- X int i, j; /* Loop variables */
- X
- X /* Lock the high score file and exit if fails */
- X if(!lock_hs_file())
- X return;
- X
- X /* Get the high score file and add the new score */
- X obtained = get_hs();
- X for(i = 0; i < 10; i++)
- X if(hs_list.scores[i] < current_score) {
- X for(j = 9; j > i; j--) {
- X hs_list.scores[j] = hs_list.scores[j - 1];
- X hs_list.levels[j] = hs_list.levels[j - 1];
- X strcpy(hs_list.names[j], hs_list.names[j - 1]);
- X }
- X hs_list.scores[i] = current_score;
- X hs_list.levels[i] = current_level;
- X strcpy(hs_list.names[i], getpwuid(getuid())->pw_name);
- X break;
- X }
- X
- X /* If the high score was obtained properly, then write the new list */
- X if(obtained) {
- X put_hs();
- X update_hs();
- X }
- X
- X /* Unlock the high score file */
- X unlock_hs_file();
- X}
- X
- X
- X/*****************************************************************
- X * lock_hs_file() - Lock the high score file against
- X * access by another program. Creates
- X * a link to the high score file.
- X * If the link fails, it will try
- X * multiple times (waiting for other
- X * process to give it up) and then it
- X * will give up and register an error.
- X *****************************************************************/
- X
- Xlock_hs_file()
- X{
- X int count = 0; /* Counter for number of attempts made */
- X
- X /* Try to create the link */
- X while(link(HSFILE, HSLOCK) == -1 &&
- X count < MAX_LOCK_TRIES)
- X count++;
- X
- X /* If failed, then send an error message */
- X if(count >= MAX_LOCK_TRIES)
- X fprintf(stderr, "Could not create lock %s\n",
- X HSLOCK);
- X
- X return(count < MAX_LOCK_TRIES);
- X}
- X
- X
- X/*****************************************************************
- X * unlock_hs_file() - Unlock the high score file
- X * so that other processes can
- X * access it.
- X *****************************************************************/
- X
- Xunlock_hs_file()
- X{
- X /* Unlink lock file */
- X unlink(HSLOCK);
- X}
- X
- X
- X/*****************************************************************
- X * dump_pic() - Dump the screen to a file.
- X *****************************************************************/
- X
- Xdump_pic()
- X{
- X char *filename, command[512];
- X int x, y, X, Y;
- X
- X if((filename = tempnam(".", "rdump")) == NULL)
- X fprintf(stderr, "Can't make dumpfile!\n");
- X else {
- X x = (int) window_get(frame, WIN_X);
- X y = (int) window_get(frame, WIN_Y);
- X X = (int) window_get(frame, WIN_WIDTH);
- X Y = (int) window_get(frame, WIN_HEIGHT);
- X sprintf(command, "screendump -x%d -y%d -X%d -Y%d %s",
- X x, y, X, Y, filename);
- X system(command);
- X }
- X}
- X
- X
- X/*****************************************************************
- X * dump_hs() - Dump the high score to a file.
- X *****************************************************************/
- X
- Xdump_hs()
- X{
- X char *filename, command[512];
- X int x, y, X, Y;
- X
- X if((filename = tempnam(".", "hdump")) == NULL)
- X fprintf(stderr, "Can't make dumpfile!\n");
- X else {
- X x = (int) window_get(hs_popup_frame, WIN_X) +
- X (int) window_get(frame, WIN_X);
- X y = (int) window_get(hs_popup_frame, WIN_Y) +
- X (int) window_get(frame, WIN_Y);
- X X = (int) window_get(hs_popup_frame, WIN_WIDTH);
- X Y = (int) window_get(hs_popup_frame, WIN_HEIGHT);
- X sprintf(command, "screendump -x%d -y%d -X%d -Y%d %s",
- X x, y, X, Y, filename);
- X system(command);
- X }
- X}
- END_OF_FILE
- if test 16439 -ne `wc -c <'sunbots.c'`; then
- echo shar: \"'sunbots.c'\" unpacked with wrong size!
- fi
- # end of 'sunbots.c'
- fi
- if test -f 'sunbots.h' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'sunbots.h'\"
- else
- echo shar: Extracting \"'sunbots.h'\" \(5034 characters\)
- sed "s/^X//" >'sunbots.h' <<'END_OF_FILE'
- X/*****************************************************************
- X *
- X * sunbots.h - Sunview Robots Header File
- X *
- X * Created -- 1/5/90 Kevin Wright
- X *
- X *****************************************************************/
- X
- X#ifndef SUNBOTS_H
- X# define SUNBOTS_H
- X
- X# include <suntool/sunview.h>
- X# include <suntool/canvas.h>
- X# include <suntool/panel.h>
- X# include <suntool/icon.h>
- X# include <suntool/tty.h>
- X# include <stdio.h>
- X# ifndef SUNOS3_5
- X# include <suntool/alert.h>
- X# endif
- X# include <suntool/seln.h>
- X# include <pwd.h>
- X# include <sys/time.h>
- X# include <sunwindow/notify.h>
- X# include "images.h"
- X
- X/*
- X * Defines
- X */
- X
- X# define SEED(x) (srandom(x)) /* Random numbers */
- X# define RND(x) ((random() >> 3) % x)
- X
- X# define NORTH 0 /* North */
- X# define NORTH_WEST 1 /* North-west */
- X# define NORTH_EAST 2 /* North-east */
- X# define SOUTH 3 /* South */
- X# define SOUTH_WEST 4 /* South-west */
- X# define SOUTH_EAST 5 /* South-east */
- X# define EAST 6 /* East */
- X# define WEST 7 /* West */
- X# define NO_MOVE 8 /* No Direction */
- X
- X# define COLLISION_HUMAN 1 /* Collision with human */
- X# define COLLISION_ROBOT 2 /* Collision with robot */
- X# define COLLISION_TRASH 3 /* Collision with trash */
- X# define COLLISION_GEM 4 /* Collision with gem */
- X# define COLLISION_OTHER 5 /* Unknown collision */
- X
- X# define LIVE_STATE 1 /* Robot is alive */
- X# define DEAD_STATE 2 /* Robot is dead */
- X# define ALL_STATES 3 /* Alive or dead */
- X
- X# define SPEEDER_LEVEL 5 /* Starting speeder level */
- X# define SPEEDER_CHANCE 10 /* Chance of being fast */
- X
- X# define ALL_ROBOTS 1 /* All robots */
- X# define NORMAL_ROBOT 2 /* Normal robot */
- X# define SPEEDER_ROBOT 3 /* Faster robot */
- X# define HUMAN 4 /* Not a robot */
- X# define GEM 5 /* A gem */
- X
- X# define ROW_HEIGHT 16 /* Height of a row */
- X# define COL_WIDTH 16 /* Width of a column */
- X# define SCRN_ROWS 40 /* Rows per screen */
- X# define SCRN_COLS 40 /* Columns per screen */
- X# define SCREEN_HEIGHT (SCRN_ROWS * ROW_HEIGHT)
- X# define SCREEN_WIDTH (SCRN_COLS * COL_WIDTH)
- X
- X# define TARDIS_BLINK_RATE 10000 /* Loop for tardis blink */
- X# define SONIC_CYCLE_RATE 5000 /* Loop for sonic cycle */
- X
- X# define HS_NAME_LEN 20 /* Length of high score name */
- X# define HS_NUM_SCORES 10 /* Number of high scores */
- X# ifndef HSFILE /* Sunbot high score file */
- X# define HSFILE "/usr/games/lib/.sunbots.hs"
- X# endif
- X# ifndef HSLOCK /* Sunbot hs lock file */
- X# define HSLOCK "/usr/games/lib/.sunbots.hs.lock"
- X# endif
- X# define MAX_LOCK_TRIES 50
- X
- X# define DEBUG_UID 114 /* Uid of debugger */
- X
- X/*
- X * Structures
- X */
- X
- Xtypedef struct screen_item {
- X int row, col; /* Row and column of item */
- X int oldrow, oldcol; /* Old position of item */
- X int type; /* Type of robot */
- X int dead; /* Flag indicating death */
- X Image image; /* Pointer to panel item */
- X struct screen_item *next; /* Pointer to next structure */
- X} *ScreenItem;
- X
- Xtypedef struct {
- X char names[HS_NUM_SCORES][HS_NAME_LEN + 1]; /* Names of scorers */
- X int scores[HS_NUM_SCORES]; /* High scores */
- X int levels[HS_NUM_SCORES]; /* High levels */
- X} HiScoreList;
- X
- X/*
- X * Global Variables
- X */
- X
- Xextern Frame frame; /* Base frame for window */
- Xextern Frame hs_popup_frame; /* High score popup sub-frame */
- Xextern Frame msg_popup_frame;/* Message popup sub-frame */
- Xextern Canvas playfield; /* Main battlefield for robots */
- Xextern Pixwin *playfield_pw; /* Pixwin for the battlefield */
- Xextern Panel msg_window; /* Panel for displaying score */
- Xextern Panel cmd_window; /* Panel that contains buttons */
- Xextern Panel mov_window; /* Panel containing movement gadgets */
- Xextern Panel hs_popup_panel; /* High score popup sub-window */
- Xextern Panel msg_popup_panel;/* Message popup sub-window */
- Xextern Panel_item score; /* Item to display score and level */
- Xextern Panel_item msg_popup_label;/* Label for popup panel */
- Xextern Panel_item hs[10]; /* Top ten scores */
- Xextern ScreenItem human; /* Structure containing human */
- Xextern ScreenItem robot_list; /* Linked list of robots */
- X
- Xextern HiScoreList hs_list; /* High score chart */
- X
- Xextern int current_level; /* Current level number */
- Xextern int current_score; /* Current score */
- Xextern int screwdriver_uses; /* How many sonic blasts */
- Xextern int last_stand_set; /* Are we doing a last stand */
- Xextern int lives_remaining; /* Number of lives remaining */
- X
- X
- X/*
- X * Functions
- X */
- X
- Xint init_msg_window(), init_playfield(), init_cmd_window(), init_hs_popup();
- Xint new_proc(), filer_proc(), move_proc(), move_human(), get_hs(), put_hs();
- Xint teleport_proc(), sonic_proc(), stand_proc(), quit_proc(), make_level();
- Xint destroy_robots(), create_robots(), find_empty(), place_item();
- Xint move_robots(), collision(), all_dead(), update_score(), update_level();
- Xint do_death(), update_hs(), do_pop_proc(), lock_hs_file(), init_msg_popup();
- Xint unlock_hs_file(), make_hs(), debug_proc(), live_proc(), display_msg();
- Xint kill_display(), setup_proc(), startup_proc(), set_image();
- X
- XScreenItem occupied();
- X
- X#endif /* SUNBOTS_H */
- END_OF_FILE
- if test 5034 -ne `wc -c <'sunbots.h'`; then
- echo shar: \"'sunbots.h'\" unpacked with wrong size!
- fi
- # end of 'sunbots.h'
- fi
- echo shar: End of archive 1 \(of 3\).
- cp /dev/null ark1isdone
- MISSING=""
- for I in 1 2 3 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 3 archives.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-